package com.ai.deepSeek.service;

import cn.hutool.http.HttpUtil;
import com.ai.deepSeek.model.request.DeepSeekReqOnLin;
import com.ai.deepSeek.model.request.Messages;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonParser;

import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
 * 国货之光 DeepSeek 官方接口 线上环境
 * @author houwenpeng
 */
@Service
public class DeepSeekOnLineService {
    private static final String API_URL = "https://api.deepseek.com/chat/completions";
    private static final String API_KEY = "sk-b3c1e9c14262451a9351d82eb9769adb";
    private static final String MODEL = "deepseek-chat";//"deepseek-coder"; //"deepseek-reasoner";//"deepseek-chat";
    private static final ObjectMapper objectMapper = new ObjectMapper();

//     model='deepseek-chat' 即可调用 DeepSeek-V3
//     model='deepseek-reasoner'，即可调用 DeepSeek-R1

    //    模型列表
    //    deepseek-chat：通用对话
    //    deepseek-coder：代码生成/分析
    //    deepseek-math：数学推理

    /*
        temperature 参数默认为 1.0。

        我们建议您根据如下表格，按使用场景设置 temperature。
        场景	温度
        代码生成/数学解题   	0.0
        数据抽取/分析	1.0
        通用对话	1.3
        翻译	1.3
        创意类写作/诗歌创作	1.5*/

/*
    00 - 格式错误	原因：请求体格式错误
    解决方法：请根据错误信息提示修改请求体
    401 - 认证失败	原因：API key 错误，认证失败
    解决方法：请检查您的 API key 是否正确，如没有 API key，请先 创建 API key
    402 - 余额不足	原因：账号余额不足
    解决方法：请确认账户余额，并前往 充值 页面进行充值
    422 - 参数错误	原因：请求体参数错误
    解决方法：请根据错误信息提示修改相关参数
    429 - 请求速率达到上限	原因：请求速率（TPM 或 RPM）达到上限
    解决方法：请合理规划您的请求速率。
    500 - 服务器故障	原因：服务器内部故障
    解决方法：请等待后重试。若问题一直存在，请联系我们解决
    503 - 服务器繁忙	原因：服务器负载过高
    解决方法：请稍后重试您的请求
*/

    /*今天，DeepSeek API 迎来更新，装备了新的接口功能，来释放模型的更多潜力：

    更新接口 /chat/completions
    JSON Output
    Function Calling
    对话前缀续写（Beta）
    8K 最长输出（Beta）
    新增接口 /completions
    FIM 补全（Beta）
    所有新功能，均可使用 deepseek-chat 和 deepseek-coder 模型调用。*/




    /**
     *  测试方法
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        try {
            // 获取模型列表
            //getMode();

            // 调用 DeepSeek API
            analysisJson(callDeepSeekAPI("总共10个苹果昨天吃掉了2个今天补充了4个问还剩下多少个苹果"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取模型列表
     */
    private static void getMode(){
        String body = HttpUtil.createGet("https://api.deepseek.com/models")
                .header("Accept", "application/json")
                .header("Authorization", "Bearer " + API_KEY).execute().body();
        //System.out.println(body);

        JSONObject jsonObject = new JSONObject(body);
        JSONArray dataArray = jsonObject.getJSONArray("data");

        // 获取所有的 id
        for (int i = 0; i < dataArray.length(); i++) {
            JSONObject item = dataArray.getJSONObject(i);
            String id = item.getString("id");
            System.out.println(id);
        }
    }

    /**
     * 调用 DeepSeek API
     * @param prompt
     * @return
     * @throws Exception
     */
    private static String callDeepSeekAPI(String prompt) throws Exception {
        URL url = new URL(API_URL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 设置请求方法、头信息等
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Authorization", "Bearer " + API_KEY);
        connection.setDoOutput(true);

        // 发送请求体（JSON格式）
        String jsonInputString =objectMapper.writeValueAsString(createDeepSeekRequest(prompt));
        try (OutputStream os = connection.getOutputStream()) {
            byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
            os.write(input, 0, input.length);
        }

        // 读取响应
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
            StringBuilder response = new StringBuilder();
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine.trim());
            }
            return response.toString();
        }
    }


    /**
     * 创建 DeepSeek 请求体
     * @param reqContent
     * @return
     */
    private static DeepSeekReqOnLin createDeepSeekRequest(String reqContent) {
        DeepSeekReqOnLin deepSeekReq = new DeepSeekReqOnLin();
        deepSeekReq.setModel(MODEL);
        deepSeekReq.setStream(false); // 设置为false，不启用流式输出

        // 构造消息
        List<Messages> messages = new ArrayList<>();

        Messages messagesObj1 = new Messages();
        messagesObj1.setRole("system"); // 设置系统角色
        messagesObj1.setContent("You are a helpful assistant."); // 设置系统角色的描述
        messages.add(messagesObj1);

        Messages messagesObj = new Messages();
        messagesObj.setRole("user");    // 设置用户角色
        messagesObj.setContent(reqContent); // 设置用户输入
        messages.add(messagesObj);


        deepSeekReq.setMessages(messages);

        return deepSeekReq;
    }

    /**
     * 解析Json
     * @param jsonString
     * @return
     */
    private static String analysisJson(String jsonString ) {
        // 解析JSON字符串
        // 获取 choices 数组中的第一个元素
        String content = JsonParser.parseString(jsonString).getAsJsonObject().getAsJsonArray("choices")
                .get(0).getAsJsonObject()
                .getAsJsonObject("message")
                .get("content").getAsString();

        System.out.println(content);  // 输出内容

        return content;
    }
}